﻿// 源文件头信息：
// <copyright file="LogingAttribute.cs">
// Copyright(c)2012-2019.
// CLR版本：4.5
// 开发组织：luochengbang@163.com
// 公司网站：
// 所属工程：iLiving.NRP.WebClient
// 最后修改：Ben.Luo
// 最后修改：2015/06/16
// </copyright>
using Janus.BaseEntitys;
using System;
using System.Collections.Specialized;
using System.Linq;
using System.Threading.Tasks;
using System.Web.Mvc;


namespace Janus.Mes.WebClient
{
    /***********************************************************************************************************
     * 描述：此记录日志基于MVC模式
     * 使用方法
     * 1.在需在记录日志的Action标记特性 [Loging("[数据对象名称（表名）]")]
     * 2.手工记录日志
     *          LogingAttribute log = new LogingAttribute(base.FilterContext);
     *          //记录日志的数据实体
                dynamic data = new DynamicEntity<Rolers>();
                data.Columns1 = CurentUser.UserName;
                data.Columns2 = CurentUser.UserCode;
                data.Columns3 = DateTime.Now;
                log.WriteLog<Rolers>(data);
     ***********************************************************************************************************/

    /// <summary>
    /// 日志记录过滤器
    /// </summary>
    //[AttributeUsage(AttributeTargets.All, AllowMultiple = false, Inherited = true)]
    //public class LogingAttribute : ActionFilterAttribute
    //{
    //    protected static ILogerEntity service = ServiceFactory.CreateServiceE<ILogerEntity>();

    //    /// <summary>
    //    /// 需要保存的数据
    //    /// </summary>
    //    public string ObjData { get; set; }

    //    /// <summary>
    //    /// 数据对象名称
    //    /// </summary>
    //    public string ObjName { get; set; }

    //    /// <summary>
    //    /// 当前用户
    //    /// </summary>
    //    public CurrentUserDTO CurentUser { get; set; }

    //    public ActionExecutingContext FilterContext { get; set; }

    //    /// <summary>
    //    /// 过滤器记录日志 objName:操作对象名称 data:操作的数据
    //    /// </summary>
    //    /// <param name="objName"></param>
    //    /// <param name="data"></param>
    //    public LogingAttribute(string objName = null, string data = null)
    //    {
    //        this.ObjName = objName;
    //        this.ObjData = data;
    //    }

    //    /// <summary>
    //    /// 手工记录日志实例
    //    /// </summary>
    //    /// <param name="objName">数据对象名称</param>
    //    /// <param name="data">操作的数据json</param>
    //    public LogingAttribute(ActionExecutingContext filterContext, string objName = null, string data = null)
    //    {
    //        FilterContext = filterContext;
    //        this.ObjName = objName;
    //        this.ObjData = data;
    //    }


    //    /// <summary>
    //    /// 记录日志
    //    /// </summary>
    //    /// <typeparam name="T">操作数据对象</typeparam>
    //    /// <param name="obj">具体操作数据</param>
    //    public void WriteLog<T>(DynamicEntity<T> obj)
    //    {
    //        if (obj != null)
    //        {
    //            this.ObjData = obj.BsonDocumentJson();
    //        }

    //        if (string.IsNullOrEmpty(this.ObjName))
    //        {
    //            this.ObjName = typeof(T).Name;
    //        }
    //        WriteLog();
    //    }

    //    public override void OnActionExecuting(ActionExecutingContext filterContext)
    //    {
    //        FilterContext = filterContext;

    //        WriteLog();
    //    }

    //    private void WriteLog()
    //    {
    //        CurentUser = FilterContext.HttpContext.Session["CurentUser"] as CurrentUserDTO;
    //        Task task = new Task(() =>
    //        {
    //            Loger.Process(() =>
    //            {

    //                if (CurentUser != null)
    //                {
    //                    LogerEntity model = new LogerEntity();
    //                    var routeOpID = FilterContext.RouteData.Values.Where(c => c.Key == "OpID").FirstOrDefault();
    //                    string opID = !string.IsNullOrEmpty(routeOpID.Key) ? routeOpID.Value.ToString() : FilterContext.HttpContext.Request["OpID"];
    //                    model.OpID = opID;
    //                    model.UserCode = CurentUser.UserInfo.UserCode;
    //                    model.UserName = CurentUser.UserName;
    //                    model.Url = FilterContext.HttpContext.Request.Url.ToString();
    //                    model.ObjName = this.ObjName;
    //                    var module = CurentUser.Modules.FirstOrDefault(c => c.ID == opID);
    //                    if (model != null)
    //                    {
    //                        //model.Url = module.Url;
    //                        model.Operation = module.Title;
    //                    }

    //                    //记录传递的数据
    //                    if (!string.IsNullOrEmpty(this.ObjData))
    //                    {
    //                        model.OpData = this.ObjData;
    //                    }
    //                    //记录表单的数据
    //                    else
    //                    {
    //                        NameValueCollection forms = FilterContext.HttpContext.Request.Form;
    //                        if (forms != null && forms.Count > 0)
    //                        {
    //                            BsonDocument b = new BsonDocument();
    //                            foreach (string item in forms)
    //                            {
    //                                b.Add(item, BsonValue.Create(forms[item]));
    //                            }
    //                            model.OpData = b.ToJson();
    //                        }
    //                        else
    //                        {
    //                            model.OpData = FilterContext.HttpContext.Request.Url.Query;
    //                        }
    //                    }
    //                    //记录路由数据
    //                    if (FilterContext.RouteData != null && FilterContext.RouteData.Values.Count > 0)
    //                    {
    //                        BsonDocument b = new BsonDocument();
    //                        foreach (var item in FilterContext.RouteData.Values)
    //                        {
    //                            b.Add(item.Key, BsonValue.Create(item.Value));
    //                        }
    //                        model.RouteData = b.ToJson();
    //                    }
    //                    service.Add(model);
    //                }
    //            });

    //        });
    //        task.Start();
    //    }
    //}
}